#!/usr/bin/env node

var image2gcode = require('../lib/image2gcode'); // 假设存在一个名为 gcode-driver 的库
const fs = require('fs');
const PNG = require('pngjs').PNG;

const params = 
{
  isRelativeCoord: true,
  width:10,
  height:10,
  laserOnCode: "M4",
  laserOffCode: "M5",
  feedRate: 100,
  rapidRate: 3000,
  pixelThreshold: 128,
  bitmapMode: 0, // 打标计算模式：0-灰度扫描 1- 黑白扫描 2-灰度打点 3- 黑白打点
  markMode: 0, // 0: 平面打标 1：扩幅打标 2：圆柱打标（抓盘）3：滚轴
  previewMode: -1,  // 1：元素预览 2：区域预览 3：旋转轴预览
  rateUnit: "mm/min",
  laserPowerMaxS: 1400,
  laserPowerMinS: 0,
  positionPrecision: 3,
  matrix: [
    1,
    0,
    0,
    1,
    50,
    50,
  ],
  canvasMatrix: [1, 0, 0, -1, -50, 50],
  // canvasMatrix: [0, 1, 1, 0, -50, -50], 
  DPI: 200,
  // laserBeamSize: 1, // 激光束宽度 / 实际分辨率，单位 mm，仿真设置为 0.147， 实际工作 0.05(即1mm打印20条线)
  times: "1",
  simulation: false,
  swapXY: false,
  // gamma: 0.45455,
  // dither: 1,
  scanDir: 'X',
  dotTime: 100,
  frequency: 60,
  rotateParams : {
    diameter: 65,
    perRevolutionPulsesClamp: 12800, // 抓盘每转脉冲数
            perRevolutionPulsesRoller: 12800, // 滚轴每转脉冲数
    rollerDiameter: 20, // 滚轴直径
    mirrorImage: true, // 镜像输出
  },
  reliefMode: {
    enabled: true, // 是否启用浮雕模式
    depth: 4, // 浮雕深度，默认 256
    scanAngleIncrement: 36, // 浮雕扫描角度增量，默认 1°
    curPlies: 2, // 当前层数 
    isIntaglioCarving: false // 默认阴雕模式
  }
};

const imageData = fs.readFileSync('./images/jianyimao1.png');
// const imageData = fs.readFileSync('./images/dotimage.png');

var image = new PNG.sync.read(imageData);
console.log(image)

getGrayScale(image); // 转为灰度图
// imageData.data = image.getBuffer();// TODO: 从 buffer变为数组
// imageData.width = image.bitmap.width;
// imageData.height = image.bitmap.height;



// 调用 bitmap2gcode 函数
var gcode =  new image2gcode.bitmap2gcode(image, params)
// var bitmap2gcode = require('../lib/bitmap2gcode2/bitmap2gcode')
// var gcode = new bitmap2gcode(image, params)


build({ code: gcode, outputFilename: './bitmapExample.gcode', filename: 'bitmapExample' });



// 创建一个空数组用于存储生成的 gcode
// let gcode = [];



// console.log('gcode result: ', gcode);

// console.log('gcode length: ', gcode.length);

function build({ code, outputFilename, filename }) {
    const file = outputFilename ? outputFilename : `./${filename}.gcode`;
    fs.writeFileSync(file, code.join("\n"));
    return Promise.resolve();
};

function getGrayScale(image) {
    for (let y = 0; y < image.height; y++) {
      for (let x = 0; x < image.width; x++) {
        const idx = (image.width * y + x) << 2;
        const avg = (image.data[idx] + image.data[idx + 1] + image.data[idx + 2]) / 3;
        image.data[idx] = avg; // Red
        image.data[idx + 1] = avg; // Green
        image.data[idx + 2] = avg; // Blue
      }
    }
  }
  

console.log("All Done!!!")